/**
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

package pittypat.primitives;

import java.io.IOException;
import java.io.Writer;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

import pittypat.Json;

/**
 * 实现了 IJson 的日期时间值。
 */
public final class DateTime implements IPrimitive {
	/**
	 * 格式为 yyyy-M-d H:m:s 的格式化字符串。
	 */
	public static final DateTimeFormatter DateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-M-d H:m:s");
	
	/**
	 * 格式为 yyyy/M/d H:m:s 的格式化字符串。
	 */
	public static final DateTimeFormatter DateTimeFormatter2 = DateTimeFormatter.ofPattern("yyyy/M/d H:m:s");

	private static final LocalDateTime MIN = LocalDateTime.of(1000, 1, 1, 0, 0, 0);

	private static final LocalDateTime MAX = LocalDateTime.of(9999, 12, 31, 23, 59, 59);
	
	/**
	 * 将指定的字符串解析为一个日期时间值。
	 * 
	 * @param s
	 *            要解析的字符串。
	 * @return 类型为 LocalDateTime 的值。
	 */
	public static LocalDateTime parse(java.lang.String s) {
		if (s == null || s.length() == 0) {
			return null;
		}

		s = s.trim();
		if (s.length() == 0) {
			return null;
		}
		
		if (s.equalsIgnoreCase("min") || s.equalsIgnoreCase("minvalue") || s.equalsIgnoreCase("default") || s.equalsIgnoreCase("min_value")) {
			return MIN;
		}

		if (s.equalsIgnoreCase("max") || s.equalsIgnoreCase("maxvalue") || s.equalsIgnoreCase("max_value")) {
			return MAX;
		}

		if (s.equalsIgnoreCase("today")) {
			LocalDateTime dt = LocalDateTime.now();
			return LocalDateTime.of(dt.getYear(), dt.getMonthValue(), dt.getDayOfMonth(), 0, 0, 0);
		}

		if (s.equalsIgnoreCase("now") || s.equalsIgnoreCase("current")) {
			return LocalDateTime.now();
		}
		
		try {
			return LocalDateTime.parse(s);
		} catch (Exception e) {
			try {
				return LocalDateTime.parse(s, DateTimeFormatter1);
			} catch (Exception e1) {
				try {
					return LocalDateTime.parse(s, DateTimeFormatter2);
				} catch (Exception e2) {
					// 看作日期
					LocalDate d = null;
					try {
						d = LocalDate.parse(s);
					} catch (Exception e3) {
						try {
							d = LocalDate.parse(s, Date.DateFormatter1);
						} catch (Exception e4) {
							try {
								d = LocalDate.parse(s, Date.DateFormatter2);
							} catch (Exception e5) {
								d = null;
							}
						}
					}
					
					return d == null ? null : LocalDateTime.of(d.getYear(), d.getMonthValue(), d.getDayOfMonth(), 0, 0, 0);
				}
			}
		}
	}

	private java.time.LocalDateTime value;

	/**
	 * 使用指定的值初始化 DateTime 类的新实例。
	 * 
	 * @param value
	 *            值。
	 */
	public DateTime(java.time.LocalDateTime value) {
		this.value = value;
	}

	/**
	 * 获取基础类型的值。
	 * 
	 * @return 基础类型的值。
	 */
	public java.time.LocalDateTime getValue() {
		return this.value;
	}

	/**
	 * 将当前对象作为 JSON 字符串写入指定的文本流。
	 * 
	 * @param writer
	 *            目标文本流。
	 * @throws IOException
	 * @see pittypat.IJson#write(java.io.Writer)
	 */
	@Override
	public void write(Writer writer) throws IOException {
		Json.write(writer, value);
	}
}
